Fdd48.narod.ru
Комментарии:
Помимо ; комментарий может начинаться с //
Для многострочных комментариев используйте /* в начале и */ в конце
Операции присваивания:
Допустимы пробелы между операндами
Старый синтаксис:
S s=1+2
Новый:
Set s = 1 + 2
If:
Более не следует беспокоиться о “точечных” блоках и значении $Test:
|
; раньше If a=4 Do |
// Теперь If (a = 4) { Set r = 6 |
|
; Раньше If ('ok) QUIT err |
// Теперь If ('ok) { QUIT err } |
Постусловия:
|
; Раньше Set:a=2 x=3 |
// Теперь If (a = 2) { Set x = 3 } |
Циклы:
|
; Раньше for i=1:1:10 Do . Write "this is line" . Write i,! |
// Теперь For i=1:1:10 { Write "this is line" Write i,! } |
$Order в цикле:
; Раньше
Set i="" For Set i=$O(^yan(i)) Quit:i="" Do
. Write ^yan(i),!
// Теперь
Set i = $O(^yan(""))
While (i '= "") {
Write ^yan(i),!
Set i = $O(^yan(i))
}
Теперь инициализация параметра цикла и его изменение происходят в разных местах – как это делается в других языках.
Использование объекта ResultSet:
|
; Раньше Do query.Execute() |
// Теперь Do query.Execute() |
Обратите внимание:
While (expr) {
New x
//
...
}
Блок { } в этом случае не создает новый кадр стека. Команда New в цикле каждый раз помещает значение в стек, пока область стека не будет полностью заполнена и Вы получите ошибку <FRAMESTACK>!
Выход по QUIT из блока { } – также как { } не открывают новый уровень стека, по QUIT происходит выход, как если бы не было блока { }:
function()
If (error) {
Quit "error" // Выход
из "function"
}
Это означает, что Вы не можете делать QUIT в конце каждого из множества операторов IF:
If (p) Do
. If x Set t=1 QUIT
. If y Set t=3
Но теперь у Вас есть настоящий ELSE, так что потеря не слишком велика:
If (p) {
If(x) { Set t = 1 }
ElseIf (y) { Set t = 3 }
}
Проблемы с использованием блоков в CDL, связанные с обрамлением начала и конца методов фигурными скобками { } решаются следующим образом:
Если строка начинается с } внутри метода в CDL, это вызовет ошибку при загрузке CDL:
// такой
вариант не работает
method Method() {
public;
code = {
If (a = 3) {
Write "Hey"
}
}
}
Предваряйте скобку } двоеточием (:) :
// делайте
так
method Method() {
public;
code = {
If (a = 3) {
Write "Hey"
:}
}
}
Обрамляйте код квадратными скобками [ ]
// так
тоже работает
method Method() {
public;
code = [
If (a = 3) {
Write "Hey"
}
]
}
$SORTBEGIN / $SORTEND
$SortBegin( имя глобала [, размер буфера] )
$SortEnd( имя глобала )
indtest //Тест, использующий $SortBegin/$SortEnd для построения индекса (^PersonI)
start
w !,"Начинаем..."
k ^PersonI,^PersonD
w !,$ZDT($H)
s IO="c:/infile.txt"
o IO:"R"
u IO
s x=$SORTBEGIN(^PersonI)
f d=1:1 D SAVE
END
s x=$SORTEND(^PersonI)
c IO
w !,$ZDT($H)
W !,"Закончили..."
q
SAVE
s $ETRAP="goto OnError^indtest"
R REC
s ln=$piece(REC,",",1)
s fn=$piece(REC,",",2)
s id = $increment(^PersonD)
s ^PersonD(id)=REC
s ^PersonI=id
s ^PersonI("Name",ln,fn,id) = ""
OnError
s $ETRAP=""
s zermes=$ZERROR
s ermes=$p($p($ZERROR,">",1),"<",2)
if ermes = "ENDOFFILE" goto END
Полученный в результате индекс ^PersonI:
^PersonI=519480
^PersonI("Name","001Adam","Frank",128872)=
^PersonI("Name","001Adams","Marianne",54946)=
^PersonI("Name","001Adams","nancy",259741)=
^PersonI("Name","001Addison","Angela",222778)=
^PersonI("Name","001Ahmed","Shuur",125875)=
^PersonI("Name","001Allen","Paul",369631)=
^PersonI("Name","001Allin","Mark",404596)=
^PersonI("Name","001Alton","Neil",206794)=
^PersonI("Name","001Anderson","Wil",496504)=
^PersonI("Name","001Aquino","Renato",197803)=
^PersonI("Name","001Arica-Cruz","Maria",260740)=
Несколько записей входного файла:
996Corman,Jed
997Corman,Jed
998Corman,Jed
999Corman,Jed
001Olsen,Cindy
002Olsen,Cindy
003Olsen,Cindy
004Olsen,Cindy
005Olsen,Cindy
006Olsen,Cindy
/*
Пример использования команды GOTO
*/
Start() PUBLIC
{
Set $ZT="Trap"
Set i=1
Write i," - начальное значение",!
Goto Internal
Inc
// Увеличим значение i
Set i=$increment(i)
Write "Увеличили значение до ",i,!
Internal
Set a = i
If a < 5
{
Write "Значение a=",a," < 5",!
Goto Inc
}
Else
{
Write "Значение a=",a," >= 5",!
Goto Outside
}
Trap
Write "Выход оказался неудачным",!
Quit
}
// Сюда из процедуры выходить можно только указав имя
// программы, иначе будет ошибка
Outside
Write "Вышли из процедуры",!
Quit
Пример использования процедур
|
; Старый синтаксис test set a=1,b=2 set result =$$doit(a,b) w !,"test a= ",a w !,"test b= ",b quit doit(a,x) new b set a=11,x=12,b=13 set result=$$doit2(a,x) w !,"doit b=",b quit 15 doit2(a,x) w !,"doit2 a=",a w !,"doit2 b=",b w !,"doit2 x=",x set b=23 q 25 |
// Новый синтаксис test set a = 1, b=2 set result =$$doit(a,b) w !,"test a= ",a w !,"test b= ",b quit doit(a, x) [b] { set a=11,x=12,b=13 set result=$$doit2(a,x) w !,"doit b=",b quit 15 } doit2(a,x) [b] { w !,"doit2 a=",a w !,"doit2 b=",b w !,"doit2 x=",x set b=23 q 25 } |